home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / genstubs / genstubs.c < prev    next >
C/C++ Source or Header  |  1989-06-10  |  5KB  |  249 lines

  1. /*
  2.  * genstubs.c: generates assembler code for the PDC version of Amiga.lib
  3.  *            from Commodore-supplied .fd files on the extras disk.
  4.  *
  5.  * Copyright 1988 by J.A.Lydiatt.  Permission is given to freely distribute
  6.  * this code for non-commercial use.
  7.  * Maintenance Notes:
  8.  *   18Jun88 - V1.0 Created by Jal.
  9.  */
  10.  
  11. #include "genstubs.h"
  12.  
  13. #define SAME        0
  14. #define END        20
  15. #define PRIVATE        21
  16. #define PUBLIC        22
  17.  
  18.  
  19. /*
  20.  * External variables:
  21.  */
  22.  
  23. char base[MAXSTR] = "";            /* ##base _SysBase for example    */
  24. int  bias = 0;                /* ##bias 30            */
  25. char Section[MAXSTR];            /* Name for SECTION "<Section>".*/
  26. FUNCINFO function;            /* The current function.    */
  27. char Version[] = "V1.1 (12Jun89)"; 
  28. char FreeMsg[] = "Freely Redistributable for non-commercial use.";
  29. FILE *fi;
  30.  
  31. /*
  32.  * Internal variables:
  33.  */
  34.  
  35. static int  genstate = 0;        /* ##private, ##public, ##end    */
  36. static TOKEN token;
  37.  
  38.  
  39. /*
  40.  * getdirective: get a directive from the current line.
  41.  */
  42.  
  43. static void getdirective()
  44. {
  45.     register TOKEN *t = &token; 
  46.     extern int strcmp();
  47.     extern char *strcpy();
  48.  
  49.  
  50.     if ( strcmp( t->id, "base" ) == SAME ){
  51.         if ( gettok( t ) == ID )
  52.             (void) strcpy( base, t->id );
  53.         else {
  54.             warn( "Expected base variable not found" );
  55.             (void) strcpy( base, "<MISSING>");
  56.         }
  57.     }
  58.     else if ( strcmp( t->id, "bias" ) == SAME ){
  59.         if  ( gettok( t ) == NUMBER )
  60.             bias = t->value;
  61.         else {
  62.             warn( "Expected bias value not found" );
  63.             bias = 30;
  64.         }
  65.     }
  66.     else if ( strcmp( t->id, "end" ) == SAME )
  67.         genstate = END;
  68.     else if ( strcmp( t->id, "private" ) == SAME )
  69.         genstate = PRIVATE;
  70.     else if ( strcmp( t->id, "public" ) == SAME )
  71.         genstate = PUBLIC;
  72.     else
  73.          warn("Unrecognized directive");
  74.     nextline();
  75. }
  76.         
  77. /*
  78.  * getparms: get the parameter definitions; return # expected.
  79.  */
  80. static int getparms( t )
  81. register TOKEN *t;
  82. {
  83.     int n, class;
  84.  
  85.     n = 0;
  86.     if ( gettok( t ) != LPAREN )
  87.         warn( "Missing '('" );
  88.     while ( (class = gettok( t )) != RPAREN
  89.          && (class != EOL && class != EOF)){
  90.         switch( class ){
  91.         case ID:
  92.             (void)strcpy( function.formal[ n++ ], t->id );
  93.             break;
  94.         case COMMA:
  95.             break;
  96.         default:
  97.             warn("Unexpected token:");
  98.         }
  99.     }
  100.     function.nformal = n;
  101.     return n;
  102. }
  103.  
  104. /*
  105.  * getregisters: parse and store the register definitions.
  106.  */
  107. static void getregisters( t )
  108. register TOKEN *t;
  109. {
  110.     int class, j;
  111.     int regno, regtype;
  112.     register FUNCINFO *f = &function;
  113.     extern char *strcat();
  114.  
  115.     j = 0;
  116.     f->regmask = 0;
  117.     while ( ( class = gettok()) != RPAREN ) {
  118.         switch( class ) {
  119.             case ID:
  120.                 regtype = toupper(t->id[0]) == 'D' ?
  121.                     0 : 8;
  122.                 regno = t->id[1] - '0';
  123.                 f->regmask |= 1 << regtype + regno;
  124.                 strcat( f->reglist[j], t->id);
  125.                 ++(f->nregs[ j ]);
  126.                 break;
  127.             case SLASH:
  128.                 strcat( f->reglist[j], "/" );
  129.                 break;
  130.             case COMMA:
  131.                 ++j;
  132.                 /* Note the fall through */
  133.             case LPAREN:
  134.                 f->reglist[j][0] = '\0';
  135.                 f->nregs[j] = 0;
  136.                 break;
  137.             default:
  138.                 goto e1;
  139.         }
  140.     }
  141.  
  142. e1:
  143.     if ( class != RPAREN )
  144.         warn("Unexpected end for register list.");
  145.  
  146.     f->nlists  = f->nregs[0] > 0 ? ++j : 0;
  147. }
  148.  
  149. /*
  150.  * getfunc: get a function definition from the current line.
  151.  */
  152. static void getfunc()
  153. {
  154.     register TOKEN    *t = &token;
  155.     register FUNCINFO *f = &function;
  156.     int nparms, class;
  157.     extern char *strcpy(), *strcat();
  158.  
  159.     (void)strcpy( f->name, "_" );
  160.     (void)strcat( f->name, t->id );
  161.     getcurline( f->givenline );
  162.     nparms = getparms( t );
  163.     if ( nparms > 0 )
  164.         getregisters( t ); 
  165.     else {
  166.         f->regmask = 0;
  167.         f->nlists = 0;
  168.     }
  169.     nextline();
  170. }
  171.  
  172. static void msg( txt, p1 )
  173. char *txt;
  174. long p1;
  175. {
  176.     fprintf( stderr, txt, p1 );
  177.     fputc( '\n', stderr );
  178.  
  179. main(argc,argv)
  180. int argc;
  181. char *argv[];
  182. {
  183.     int class;
  184.     register char *s, *p;
  185.     extern char *strncpy();
  186.  
  187.     if ( argc != 2 ) {
  188.         msg("Useage: %s infile.fd", argv[0] );
  189.         exit(4);
  190.     }
  191.  
  192.     if ( (fi = fopen(argv[1], "r")) == NULL ) {
  193.         msg("Can't open %s for input\n", argv[1]);
  194.         exit(4);
  195.     }
  196.  
  197.     fprintf(stderr,    "Genstubs %s by J.A. Lydiatt.\n", Version );
  198.     fprintf(stderr, "%s\n", FreeMsg );
  199.  
  200.     /*
  201.      * Make a Section name from arv[1] up to "_lib.fd"
  202.      */
  203.  
  204.     for ( s=Section,p=argv[1]; *p; s++,p++){
  205.         if ( *p == '_' || *p == '.' )
  206.             break;
  207.         *s = *p;
  208.     }
  209.     *s = '\0';
  210.  
  211.     /*
  212.      * Capitalize the first letter.
  213.      */
  214.  
  215.     s = Section;
  216.     if ( 'a' <= *s && *s <= 'z' )
  217.         *s += 'A' - 'a';
  218.  
  219.     
  220.     nextline();
  221.  
  222.     while (    (class = gettok( &token )) != EOF) {
  223.         switch (class){
  224.             case ID:
  225.                 getfunc();
  226.                 if ( genstate == PUBLIC )
  227.                     genfunc();
  228.                 bias += 6;
  229.                 break;
  230.             case DIRECTIVE:
  231.                 getdirective();
  232.                 break;
  233.             case COMMENT:
  234.                 nextline();
  235.                 break;
  236.             case EOF:
  237.                 break;
  238.             default:
  239.                 warn("Unrecognized line!\n");
  240.                 nextline();
  241.         }
  242.  
  243.     }
  244.  
  245.     fclose(fi);
  246.  
  247. }
  248.